Quiero actualizar mi código de comandos sin reiniciar el bot completamente usando nodemon o solo node . Quería hacer un comando que pueda enviar para actualizar todos los comandos en mi bot (básicamente, la colección de comandos donde están y su código almacenado). Aquí está el código que traté de usar:
const { glob } = require('glob') const { promisify } = require('util') const globPromise = promisify(glob); await client.commands.clear() const commandFiles = await globPromise(`${process.cwd()}/commands/**/*.js`); commandFiles.map((value) => { const file = require(value); const splitted = value.split("/"); const directory = splitted[splitted.length - 2]; if (file.name) { const properties = { directory, ...file }; client.commands.set(file.name, properties); } })El resultado dice que mi código funcionó pero los comandos no se actualizan, ¿cómo puedo solucionarlo? Por si acaso: mi versión de djs es v13.2.0
El uso de esta función elimina el caché correspondiente al módulo/archivo y obtiene la versión actualizada:
function requireUncached(module) { delete require.cache[require.resolve(module)]; return require(module); } Ahora, para requerir los archivos, simplemente reemplace require con requireUncached .
Sin embargo, es posible que deba actualizar cada evento para evitar que se actualice tarde.
client.on("messageCreate", msg => { client.commands.clear(); const files = fs.readdirSync("./commands") //read commands folder const folders = files.filter(f => !f.includes(".")) //get category folders for (const folder of folders) { const cmdFiles = fs.readdirSync(`./commands/${folder}`).filter(f => f.endsWith(".js")) //get cmd files in each folder for (const file of cmdFiles) { const f = requireUncached(`./commands/${folder}/${file}`) //require the file "uncached" client.commands.set(f.name, f) } } })Puede haber formas más eficientes de hacer esto, asegurándose de que no tenga que actualizar cada evento